热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python|爬虫数据分析实战Ⅰ

“Talkischeap,Showmethecode.”翻译为中文是“废话少说,放码过来。”我觉得可谓信达雅。在编程之路上,实践的重要性无可比拟。这也是很多同学感觉学了很多,但还是

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

“Talk is cheap,Show me the code.”翻译为中文是“废话少说,放码过来。”我觉得可谓信达雅。

在编程之路上,实践的重要性无可比拟。这也是很多同学感觉学了很多,但还是不会写代码的原因;也是很多有意转行的人士,自学了大半年,仍不见起色的缘故。

leoxin在知识星球发起一项活动:目标是爬取拉钩网的招聘信息以及链家的房产信息,然后对数据进行清洗和存储,并分析其数据下的价值,最后用可视化的形式表现出来。

我觉得难度适中,循序渐进,对于不同身份角色的学习人群都大有裨益。

下面我来写一写在第一阶段的一些学习操作总结和感受。

爬虫

构思/准备部分

首先打开

找工作-互联网招聘求职网-拉勾网www.lagou.com《Python | 爬虫-数据分析实战Ⅰ》

我初步选择的是Java-上海

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

Step1

打开浏览器开发者工具,观察Network部分的内容,首先点进Doc部分,看看服务器给我们返回了哪些文本内容。

在Preview预览中,我们可以看到,大部分都是一些公共视图框架和公共JS代码,没有核心数据。

那么这时我们就应该猜测,网站可能是首先渲染一个公共框架,然后再通过Ajax发送请求去获得数据,再在页面上显示获取的数据。

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

Step2

通过Step1的思考和猜测,大致确定了数据是异步获取的。做过一点web的应该都想得到这一点,因为即使是反爬,也要按照基本法啊!应该不会使用多么多么匪夷所思的黑科技(如果真的出现了,那是我太菜了的原因(っ °Д °;)っ)

这时点开XHR按钮,XHR全称XMLHttpRequest,有什么作用呢?Ajax通过XMLHttpRequest对象发出HTTP请求,得到服务器返回的数据。

通过预览我们可以发现,我们需要的数据都出现在positionAjax请求下返回的数据中,参见content-positionResult-result中。

那么该如何伪造请求?

点进Headers,首先发现 RequestMethod的值是 POST,确定了我们提交请求的方式。然后看看 RequestHeaders中的字段。

发现有好多条。

  1. Accept:application/json, text/Javascript, */*; q=0.01
  2. Accept-Encoding:gzip, deflate, br
  3. Accept-Language:zh-CN,zh;q=0.9
  4. Connection:keep-alive
  5. Content-Length:23
  6. Content-Type:application/x-www-form-urlencoded; charset=UTF-8
  7. COOKIE:XXX
  8. Host:www.lagou.com
  9. Origin:https://www.lagou.com
  10. Referer:https://www.lagou.com/jobs/list_Java?px=default&city=%E4%B8%8A%E6%B5%B7
  11. User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
  12. X-Anit-Forge-Code:0
  13. X-Anit-Forge-Token:None
  14. X-Requested-With:XMLHttpRequest

通过筛选,我们选取其中有用的几条,构建自己的请求头。(那么怎么知道哪些是有用的呢?首先筛除语言,编码之类的,这些的影响一般都是比较小的;接着在剩下的字段中进行尝试,等以后有经验了,自然能准确选取有价值的字段)

由于是POST的请求方式,那么势必会向服务器提交一些数据,可以看到表单信息:

  1. first:true
  2. pn:1
  3. kd:Java

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

实现/代码部分

Step1

在进行上述分析后,基本已经准备得差不多了。这时可以先简单构建一下我们的Proxy类。

  1. class Proxy():
  2. def __init__(self):
  3. self.MAX=5 #最大嗅探次数
  4. self.headers={
  5. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
  6. "Referer":"https://www.lagou.com/jobs/list_Java?px=default&city=%E4%B8%8A%E6%B5%B7",
  7. "X-Anit-Forge-Code":"0",
  8. "X-Anit-Forge-Token":"None",
  9. "X-Requested-With":"XMLHttpRequest"
  10. }
  11. def getPage(self,url,data):
  12. FAILTIME=0 #访问失败次数
  13. try:
  14. result=requests.post(url,headers=self.headers,data=data)
  15. result.encoding = "utf-8"
  16. return result
  17. except:
  18. FAILTIME+=1
  19. if FAILTIME==self.MAX:
  20. print("访问错误")
  21. return ''

上文中提到,发现Ajaxposition返回的content-positionResult-result数据,数据格式是一个数组里有15条数据,每条数据的格式是一个字典,具体如下:

  1. adWord:9
  2. appShow:0
  3. approve:1
  4. businessZones:["唐镇", "唐镇", "曹路", "曹路"]
  5. city:"上海"
  6. companyFullName:"招商银行股份有限公司信用卡中心"
  7. companyId:6796
  8. companyLabelList:["金融科技银行", "技术创新驱动", "奋斗独立改变", "一年两次调薪"]
  9. companyLogo:"i/image2/M00/25/D7/CgoB5lodmL2AJHxrAABieRjcJjU514.png"
  10. companyShortName:"招商银行信用卡中心"
  11. companySize:"2000人以上"
  12. createTime:"2018-03-09 09:14:30"
  13. deliver:0
  14. district:"浦东新区"
  15. education:"本科"
  16. explain:null
  17. financeStage:"上市公司"
  18. firstType:"开发/测试/运维类"
  19. formatCreateTime:"09:14发布"
  20. gradeDescription:null
  21. hitags:null
  22. imState:"today"
  23. industryField:"移动互联网,金融"
  24. industryLables:[]
  25. isSchoolJob:0
  26. jobNature:"全职"
  27. lastLogin:1520581074000
  28. latitude:"31.247248"
  29. linestaion:null
  30. longitude:"121.673868"
  31. pcShow:0
  32. plus:null
  33. positionAdvantage:"五险一金,职位晋升,各类补贴"
  34. positionId:2762378
  35. positionLables:["项目管理", "j2ee", "架构"]
  36. positionName:"Java技术经理"
  37. promotionScoreExplain:null
  38. publisherId:73936
  39. resumeProcessDay:1
  40. resumeProcessRate:100
  41. salary:"30k-50k"
  42. score:0
  43. secondType:"管理岗"
  44. stationname:null
  45. subwayline:null
  46. workYear:"5-10年"

可见返回了大量的信息,那么我们如何去获得这些数据?此时可以写一个简单的Job类:

  1. class Job:
  2. def __init__(self):
  3. self.datalist=[]
  4. def getJob(self,url,data):
  5. p=Proxy()
  6. result=p.getPage(url,data)
  7. result.encoding = "utf-8"
  8. result_dict=result.json()
  9. try:
  10. job_info = result_dict['content']['positionResult']['result']
  11. for info in job_info:
  12. print(info)
  13. return job_info
  14. except:
  15. print("发生解析错误")

使用getJob方法获取的是所有的信息,这其实是不必要的,应该也有所选择,否则将给自己带来压力,对于后续步骤也将带来不便。

Step2

此时,一个简单的爬虫已经编写得差不多了,我们可以进行测试一下。
编写主函数

  1. if __name__ == '__main__':
  2. url="https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E4%B8%8A%E6%B5%B7&needAddtiOnalResult=false&isSchoolJob=0"
  3. job = Job()
  4. all_page_info=[]
  5. for x in range(1,31):
  6. data = {
  7. "first": "false",
  8. "pn": x,
  9. "kd": "Java"
  10. }
  11. current_page_info=job.getJob(url,data)
  12. all_page_info.extend(current_page_info)
  13. print("第%d页已经爬取成功"%x)
  14. time.sleep(5)

可以看到控制台显示:

《Python | 爬虫-数据分析实战Ⅰ》
《Python | 爬虫-数据分析实战Ⅰ》

总结

到这里,一个简单的爬虫已经编写完毕了,数据以json格式返回,似乎已经大功告成。而事实是,对于为后面的数据分析做准备工作还差得远,对于爬取海量数据,下面有几点思考。

  • 拉钩网对于同一ip的大量请求行为肯定会进行封禁,所以需要准备代理池。
  • 为了实现高自动化,需要对一系列可能出现的异常情况进行处理,断点处理,确保程序不挂。
  • 为了提高效率,加入多线程。
  • 数据持久化,在持久化之前需要先进行清洗。
  • ……

针对以上问题,需要进一步学习。

公众号:「果核里的图灵」

一条小白的探索之路


推荐阅读
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
author-avatar
嘛道理
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有